package br.ufrj.dcc.ad.systems;

import java.util.ArrayList;

import br.ufrj.dcc.ad.generators.TimeGenerator;

public class LifoFifo extends Fila{
	/**
	 * Inicializa uma fila com politica de atendimento LIFOFIFO.
	 * Será usada para o cenário 2 do trabalho.
	 * @param geradorServico Gerador de tempos de serviço desta fila.
	 */
	public LifoFifo(TimeGenerator geradorServico){
		super(geradorServico);
		clientes = new ArrayList<Cliente>();
	}
	@Override
	public void add(Cliente cliente) {
		addLast(cliente);
	}

	@Override
	public void remove(Cliente cliente) {
		clientes.remove(cliente);
	}

	@Override
	public void reenter(Cliente cliente) {
		addLast(cliente);
	}
	
	@Override
	public void interruptReenter(Cliente cliente) {
		addFirst(cliente); 
	}

	@Override
	public Cliente getAndRemoveNext() {
		return ((ArrayList<Cliente>) clientes).remove(clientes.size() - 1);
	}

	@Override
	public Cliente seeNext() {
		return ((ArrayList<Cliente>) clientes).get(clientes.size() - 1);
	}
	
	private void addFirst(Cliente cliente){
		ArrayList<Cliente> fila = (ArrayList<Cliente>) clientes;
		if(!fila.contains(cliente)){
			fila.add(0, cliente);
		}
	}
	
	private void addLast(Cliente cliente){
		ArrayList<Cliente> fila = (ArrayList<Cliente>) clientes;
		if(!fila.contains(cliente)){
			fila.add(cliente);
		}
	}
	@Override
	public Cliente lessPriority(Cliente cliente1, Cliente cliente2) {
		if(cliente1.getNome().compareTo(cliente2.getNome()) > 0){
			return cliente2;
		}
		return cliente1;
	}

}